/* 统计语法树中 print 语句最大参数的个数 */
#include "slp.h"
#include "maxargs.h"

#define NULL 0

int maxargs(A_stm stm)
{
    return maxargsStm(stm);
}

int max(int a,int b)
{
    return (a > b)? a : b;
}

// 统计参数列表元素个数
int countargsExpList(A_expList expList)
{
    // 递归基
    if (expList == NULL){
        return 0;
    }
    switch(expList->kind) {
        case A_pairExpList: // 表达式列表
            return 1 + countargsExpList(expList->u.pair.tail);
        case A_lastExpList: //赋值语句
            return 1;
    }
    return 0;
}

int maxargsStm(A_stm stm)
{
    // 递归基
    if (stm == NULL){
        return 0;
    }

    switch(stm->kind) {
        case A_compoundStm: //复合语句
            return max(maxargs(stm->u.compound.stm1), maxargs(stm->u.compound.stm2));
        case A_assignStm: //赋值语句
            return maxargsExp(stm->u.assign.exp);
        case A_printStm: // 打印语句，此时进行统计。取当前值（countargs）与参数列表(maxargs)的最大值。计数基
            return max(countargsExpList(stm->u.print.exps), maxargsExpList(stm->u.print.exps));
    }

    return 0;
}

int maxargsExp(A_exp exp)
{
    // 递归基
    if (exp == NULL){
        return 0;
    }

    switch(exp->kind) {
        // id 和 num 不进行计数
        case A_opExp: // 表达式
            return max(maxargsExp(exp->u.op.left), maxargsExp(exp->u.op.right));
        case A_eseqExp: // 逗号表达式
            return max(maxargsStm(exp->u.eseq.stm), maxargsExp(exp->u.eseq.exp));
    }

    return 0;
}

int maxargsExpList(A_expList expList)
{
    // 递归基
    if (expList == NULL){
        return 0;
    }

    switch(expList->kind) {
        case A_pairExpList: // 表达式列表
            return max(maxargsExp(expList->u.pair.head), maxargsExpList(expList->u.pair.tail));
        case A_lastExpList: //赋值语句
            return maxargsExp(expList->u.last);
    }

    return 0;
}